const char *filename,
ParsedTreeData *tree,
int *out_filename_index, /* out*/
- char **out_component, /* out, but do not free */
+ char **out_component, /* out, must free */
ParsedTreeData **out_tree, /* out, but do not free */
GError **error)
{
GPtrArray *components = NULL;
ParsedTreeData *current_tree = tree;
const char *component = NULL;
- const char *file_sha1;
- ParsedDirectoryData *dir;
+ const char *file_sha1 = NULL;
+ ParsedDirectoryData *dir = NULL;
int i;
int ret_filename_index = 0;
component = components->pdata[i];
file_sha1 = g_hash_table_lookup (current_tree->files, component);
dir = g_hash_table_lookup (current_tree->directories, component);
-
+
if (!(file_sha1 || dir))
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
filename);
goto out;
}
- else if (!dir)
- g_assert_not_reached ();
- current_tree = dir->tree_data;
- ret_filename_index++;
+ else
+ {
+ g_assert (dir != NULL);
+ current_tree = dir->tree_data;
+ ret_filename_index++;
+ }
}
ret = TRUE;
- g_assert (!(file_sha1 && dir));
*out_filename_index = i;
- *out_component = components->pdata[i-1];
+ *out_component = components->pdata[components->len-1];
+ components->pdata[components->len-1] = NULL; /* steal */
*out_tree = current_tree;
out:
g_ptr_array_free (components, TRUE);
{
const char *filename = removed_files->pdata[i];
int filename_index;
- const char *component;
+ char *component = NULL;
ParsedTreeData *parent;
const char *file_sha1;
ParsedTreeData *dir;
else if (dir)
g_hash_table_remove (parent->directories, component);
else
- g_assert_not_reached ();
+ {
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "No such file or directory: %s",
+ filename);
+ g_free (component);
+ goto out;
+ }
+ g_free (component);
}
ret = TRUE;
}
assert_has_file () {
- test -f $1 || (echo "Couldn't find $1"; exit 1)
+ test -f "$1" || (echo "Couldn't find '$1'"; exit 1)
+}
+
+assert_not_has_file () {
+ if test -f "$1"; then
+ echo "File '$1' exists"; exit 1
+ fi
}
setup_test_repository1 () {
mkdir baz/another/
echo x > baz/another/y
- mkdir ../repo
- ht_repo="--repo=../repo"
+ cd ..
+ mkdir repo
+ cd repo
+ ht_repo="--repo=`pwd`"
+ cd ../files
export ht_repo
hacktree init $ht_repo
hacktree commit $ht_repo -s "Test Commit 1" -b "Commit body first" --add=firstfile
--- /dev/null
+#!/bin/bash
+#
+# Copyright (C) 2011 Colin Walters <walters@verbum.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# Author: Colin Walters <walters@verbum.org>
+
+set -e
+
+. libtest.sh
+
+echo '1..4'
+
+setup_test_repository2
+hacktree checkout $ht_repo HEAD $test_tmpdir/checkout2-head
+echo 'ok setup'
+cd $test_tmpdir/checkout2-head
+hacktree commit -s delete $ht_repo -r firstfile
+echo 'ok rm firstfile'
+assert_has_file firstfile # It should still exist in this checkout
+cd $test_tmpdir
+hacktree checkout $ht_repo HEAD $test_tmpdir/checkout3-head
+echo 'ok checkout 3'
+cd $test_tmpdir/checkout3-head
+assert_not_has_file firstfile
+assert_has_file baz/saucer
+echo 'ok removal full'